#pragma once
#include <cstddef>
#include <odb/core.hxx>
#include <string>

namespace ken_im
{
#pragma db object table( "friend_apply" )
/**
 * @class FriendApply
 * @brief FriendApply 类用于表示好友申请事件，包含事件ID、用户ID和对方ID。
 *
 * 这个类主要用于存储和操作好友申请事件的相关信息。它包含三个主要属性：
 * - 事件ID (_event_id)
 * - 用户ID (_user_id)
 * - 对方ID (_peer_id)
 *
 * 构造函数提供了两种初始化方式：
 * - 默认构造函数，用于创建一个空的 FriendApply 对象。
 * - 带参数的构造函数，用于直接初始化 FriendApply 对象的属性。
 *
 * 示例代码：
 * @code
 * FriendApply apply("event123", "user456", "peer789");
 * std::string event = apply.event_id(); // 获取事件ID
 * apply.event_id("newEvent123"); // 设置新的事件ID
 * @endcode
 */
class FriendApply
{
  public:
    /**
     * @brief 默认构造函数，创建一个空的 FriendApply 对象。
     */
    FriendApply()
    {
    }

    /**
     * @brief 带参数的构造函数，用于初始化 FriendApply 对象的属性。
     *
     * @param eid 事件ID
     * @param uid 用户ID
     * @param pid 对方ID
     */
    FriendApply( const std::string &eid, const std::string &uid,
                 const std::string &pid )
        : _user_id( uid ), _peer_id( pid ), _event_id( eid )
    {
    }

    /**
     * @brief 获取事件ID。
     *
     * @return 事件ID
     */
    std::string event_id() const
    {
        return _event_id;
    }

    /**
     * @brief 设置事件ID。
     *
     * @param eid 新的事件ID
     */
    void event_id( std::string &eid )
    {
        _event_id = eid;
    }

    /**
     * @brief 获取用户ID。
     *
     * @return 用户ID
     */
    std::string user_id() const
    {
        return _user_id;
    }

    /**
     * @brief 设置用户ID。
     *
     * @param uid 新的用户ID
     */
    void user_id( std::string &uid )
    {
        _user_id = uid;
    }

    /**
     * @brief 获取对方ID。
     *
     * @return 对方ID
     */
    std::string peer_id() const
    {
        return _peer_id;
    }

    /**
     * @brief 设置对方ID。
     *
     * @param uid 新的对方ID
     */
    void peer_id( std::string &uid )
    {
        _peer_id = uid;
    }

  private:
    friend class odb::access;
#pragma db id auto
    unsigned long _id;
#pragma db type( "varchar(64)" ) index unique
    std::string _event_id;
#pragma db type( "varchar(64)" ) index
    std::string _user_id;
#pragma db type( "varchar(64)" ) index
    std::string _peer_id;
};
} // namespace ken_im